package cn.Fanxing;
/*本类用于练习泛型*/
public class Generic<T>{
    private T key;

    public Generic(T key){
        this.key = key;
    }

    public T getKey(){
        return key;
    }
/*    没有声明泛型E,所以使用E做形参与返回值类型时,编译器无法识别
    public E setkey(E key){
        retrun key;
    }*/
    /**
     * @param generic  泛型类引用
     * @param <T>      泛型类类型
     * @return          返回值
     * 这是泛型方法
     * public 和返回值之间的<T> 必须要有,同时声明了返回值T
     * 泛型的数量可以为任意多个*/
    public <T> T showKeyName(Generic<T> generic){
        return generic.key;
    }
    /**
     * @param generic 不是泛型方法,是形参,类型是<T>
     **/
    public void ShowKeyNome1(Generic<T> generic){

    }
    /**
    * @param generic 不是泛型方法 ?是实参,赋值的时候再赋予
     * */
    public void showKeyName2(Generic<?> generic){

    }
    /**
     * 这个方法有问题,因为泛型类型E未被声明
     *
     * @parpm generic Generic 类的引用对象,其类型为E
     * @param <T>       声明泛型方法
     * @return 返回值类型为T
    public <T> T showKeyName3(Generic<E> generic){

    }*/
    /**
     * 是正确的泛型方法
     * 声明了一个方法,无返回值,使用泛型E,E可为任意类型
     * 由于泛型方法在声明的时候会声明泛型<E>,因此即使在泛型类中没有声明泛型,编译器也正确识别泛型方法中的泛型
     * */
    public <E> void showKeyName3(E t){

    }
    /**
     * 声明了一个泛型方法,无返回值,使用泛型,T可为任意类型
     * 注意这里的T与泛型类中定义的T 不是一个类型*/
    public <T> void showKeyName4(T t){

    }
    /**
     * 声明了一个泛型方法,无返回值,使用泛型,T可为多个任意类型
     * showKeyName4的输入参数可以为任意个,任意种
     * */
    public static <T> void showKeyName(T...args){
        for(T t :args){
            System.out.println(t);
        }
    }
    /**
     * 对于需要使用泛型的静态方法而言,需要添加额外的泛型声明
     * 即使静态方法中使用过泛型类中的声明也不可以
     * T t和<T>要保持一致*/
    public static<T> void showKeyName5(T t){

    }
}
